//package com.sptus.mqtt;
//
//import cn.hutool.core.util.ObjectUtil;
//import com.sptus.common.core.redis.RedisCache;
//import com.sptus.service.IEmailService;
//import lombok.extern.slf4j.Slf4j;
//import org.springframework.beans.factory.annotation.Autowired;
//import org.springframework.scheduling.annotation.Scheduled;
//import org.springframework.stereotype.Component;
//
//import java.util.ArrayList;
//import java.util.List;
//import java.util.concurrent.TimeUnit;
//
///**
// * IoT定时刷新任务
// * 每5分钟执行一次
// * 可用于设备状态、Redis key、邮件等定时处理
// */
//@Component
//@Slf4j
//public class IotRefreshJob {
//
//    @Autowired
//    RedisCache redisUtil;
//
//    @Autowired
//    IEmailService emailService;
//
//    public static final String REDIS_SN_LIST_KEY = "iot_sn_list";
//    public static final String REDIS_DURING_KEY_FORMAT = "iot_during_time_%s";
//    public static final String REDIS_EMAIL_SENT_KEY_FORMAT = "iot_email_sent_%s";
//
//    /**
//     * 每5分钟执行一次的定时任务方法
//     */
//    @Scheduled(cron = "0 */5 * * * ?")
//    public void refresh() {
//        log.info("IotRefreshJob定时任务执行开始");
//
//        // 1. 获取所有设备号
//        List<String> snList = redisUtil.getCacheList(REDIS_SN_LIST_KEY);
//        if (snList == null || snList.isEmpty()) {
//            log.info("当前无设备号需要检查");
//            return;
//        }
//        long currentTime = System.currentTimeMillis();
//        long fiveMinutes = 5 * 60 * 1000;
//        for (String sn : snList) {
//            String snMsgKey = String.format(REDIS_DURING_KEY_FORMAT, sn);
//            Object snMsgValue = redisUtil.getCacheObject(snMsgKey);
//            if (!ObjectUtil.isEmpty(snMsgValue)) {
//                try {
//                    long lastUpdate = Long.parseLong(snMsgValue.toString());
//                    long timeDiff = currentTime - lastUpdate;
//                    if (timeDiff > fiveMinutes) {
//                        // 超过5分钟未更新，触发告警
//                        log.warn("设备 {} 超过5分钟未更新，触发告警，间隔: {}ms", sn, timeDiff);
//                        // 检查2小时内是否已发过邮件
//                        String emailSentKey = String.format(REDIS_EMAIL_SENT_KEY_FORMAT, sn);
//                        Object emailSentFlag = redisUtil.getCacheObject(emailSentKey);
//                        if (ObjectUtil.isEmpty(emailSentFlag)) {
//                            // 2小时内未发过，发送邮件
//                            List<String> targetEmailList = new ArrayList<>();
//                            targetEmailList.add("314886745@qq.com");
//                            targetEmailList.add("jzy08707003@126.com");
//                            emailService.sendDeviceWarningInfoEmail(targetEmailList, "job", sn, "未更新超时", "设备超过5分钟未更新");
//                            log.info("告警邮件发送成功, SN: {}", sn);
//                            // 设置2小时内只发一次
//                            redisUtil.setCacheObject(emailSentKey, "1", 2, TimeUnit.HOURS);
//                        } else {
//                            log.info("设备 {} 2小时内已发过邮件，本次不再发送", sn);
//                        }
//                    }
//                } catch (Exception e) {
//                    log.error("解析设备 {} 的更新时间失败: {}", sn, e.getMessage(), e);
//                }
//            }
//        }
//        log.info("IotRefreshJob定时任务执行完成");
//    }
//}